<?php
/**
 * Smarty write file plugin
 *
 * @package Smarty
 * @subpackage PluginsInternal
 * @author Monte Ohrt
 */

/**
 * Smarty Internal Write File Class
 *
 * @package Smarty
 * @subpackage PluginsInternal
 */
class Smarty_Internal_Write_File {
	
	/**
	 * Writes file in a safe way to disk
	 *
	 * @param $_filepath string
	 *       	 complete filepath
	 * @param $_contents string
	 *       	 file content
	 * @param $smarty Smarty
	 *       	 smarty instance
	 * @return boolean true
	 */
	public static function writeFile($_filepath, $_contents, Smarty $smarty) {
		$_error_reporting = error_reporting ();
		error_reporting ( $_error_reporting & ~ E_NOTICE & ~ E_WARNING );
		if ($smarty->_file_perms !== null) {
			$old_umask = umask ( 0 );
		}
		
		$_dirpath = dirname ( $_filepath );
		// if subdirs, create dir structure
		if ($_dirpath !== '.' && ! file_exists ( $_dirpath )) {
			mkdir ( $_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true );
		}
		
		// write to tmp file, then move to overt file lock race condition
		$_tmp_file = $_dirpath . DS . uniqid ( 'wrt' );
		if (! file_put_contents ( $_tmp_file, $_contents )) {
			error_reporting ( $_error_reporting );
			throw new SmartyException ( "unable to write file {$_tmp_file}" );
			return false;
		}
		
		// remove original file
		@unlink ( $_filepath );
		
		// rename tmp file
		$success = rename ( $_tmp_file, $_filepath );
		if (! $success) {
			error_reporting ( $_error_reporting );
			throw new SmartyException ( "unable to write file {$_filepath}" );
			return false;
		}
		
		if ($smarty->_file_perms !== null) {
			// set file permissions
			chmod ( $_filepath, $smarty->_file_perms );
			umask ( $old_umask );
		}
		error_reporting ( $_error_reporting );
		return true;
	}

}

?>